import numpy as np


# arr = [1,2,3]
# print(len(arr))
# print(dir(arr))


# #定义一个数组
# arr = np.array([[1,2,3],[4,5,6]])#注意，是[数组，数组]
#
# print(arr) #打印出数组
# print(f'数组的维度：{arr.ndim}') #数组的维度
# print(f'数组形状：{arr.shape}') #数组的形状，几行几列
# print(f'数组的个数：{arr.size}') #数组元素的个数
# print(f'数组元素的类型：{arr.dtype}') #数组元素类型
# print(f'元素所占字节：{arr.itemsize}') #元素所占字节
# print(f'数组所占内存大小：{arr.nbytes}') #数组所占内存大小

# # 2.每行的元素必须相同
# print(arr)
# print(arr.shape)


# 3.range生成数组
# arr_1 = [i for i in range(5)]
# print(arr_1)
#
# arr_2 = [i for i in range(1,6)]
# print(arr_2)

# a = np.array([[i for i in range(5)],[i for i in range(1,6)]])
# print(arr)
# print(f'数组的维度：{a.ndim}') #数组的维度
# print(f'数组的形状：{a.shape}') #数组的形状，几行几列
# print(f'数组的大小：{a.size}') #数组元素的个数

# # 4.元组创建
# arr = np.array(((1,2,3),(4,5,6)))
# print(arr)
# print(f'元组维度：{arr.ndim}')
# print(f'元组形状：{arr.shape}')
# print(f'元组大小：{arr.size}')

# # 5.数组+元组创建
# print("自动匹配类型：")
# a = np.array([[i for i in range(5)],[i for i in range(1,6)]])
# print(a)
# print(f'数组的维度：{a.ndim}') #数组的维度
# print(f'数组的形状：{a.shape}') #数组的形状，几行几列
# print(f'数组的大小：{a.size}') #数组元素的个数
# print(f'数组元素的类型：{a.dtype}')
# print('')
#
# print("自定义的类型：")
# arr = np.array([[1,2,3],(1,2,3)], dtype = np.float32)
# print(arr)
# print(f'维度：{arr.ndim}')
# print(f'形状：{arr.shape}')
# print(f'大小：{arr.size}')
# print(f'数组元素的类型：{arr.dtype}')



# # # 6.np.arange(n), np.ones(shape), np.zeros(shape), np.full(shape,value),np.eye(n)
#
# print(np.arange(5))
# print("")
# print(np.zeros((2,2)))
# print("")
# print(np.ones((3,3)))
# print("")
# print(np.full((3,3),6))
# print("")
# print(np.eye(4))

# # 7. 用内置函数从产生特定形式的数组

# arr1 = np.arange(6)
# print(f'np.arange(6):{ arr1}')
#
# arr2 = np.arange(1,6)
# print(f'np.arange(1, 6):{ arr2}')
#
# arr3 = np.arange(2, 7, 2)
# print(f'np.arange(1, 7, 2):{ arr3}')


#
# arr1 = np.linspace(1,10,10)
# print(f"起始值为1，终止值为10，元素个数为10：{arr1}")
#
# arr2 = np.linspace(1,1,10)
# print(f"数组元素全部为1，个数为10的数列：{arr2}")
#
# arr3 = np.linspace(10,20,5)
# print(f'取终止值20：{arr3}')
#
# arr4 = np.linspace(10,20,5,endpoint = False)
# print(f'不取终止值20：{arr4}')
#
# arr5 = np.linspace(1,6,6).reshape(2,3)
# print(f'将数组设置为 2行3列 :')
# print(arr5)

# # 8.生成类型为空的数组,元素的值是随机的
# arr1 = np.empty(2)
# print(arr1)



#
# arr2 = np.empty(6).reshape(3,2)
# print(arr2)
#
# arr3 = np.empty((2,3))
# print(arr3)

# # #9.生成随机数组
# arr1 = np.random.rand(5)
# print(f"rand()生成长度为5的一维随机浮点数数组：{arr1}")
# print('')
# arr2 = np.random.rand(3,2)
# print(f"rand()生成三行两列的随机小数数组:")
# print(arr2)
# print('')
# arr3 = np.random.randint(1,5,size = (2,3))
# print(f"randint()生成2行3列的从[1，5）之间取的整数数组：{arr3}")
# print('')
# arr4 = np.random.randn(10)
# print(f"randn()生成一组符合标准正态分布的随机样本值：{arr4}")
# print('')
# arr5 = np.arange(10)
# np.random.shuffle(arr5)
# print(f"打乱数组的顺序：{arr5}")
# print('')
# arr7 = np.arange(10)
# arr8 = np.random.permutation(arr7)
# print(f"返回对arr7随机排序的结果：{arr8}")

# 同一类型
# arr = np.array([[1,2,3],[6,7,8],(1.1, 2.2, 3.3)])
# print(arr.dtype)

#数组的迭代
# arr1 = np.array([1, 2, 3])
# print("一维数组迭代：")
# for i in arr1:
#     print(i)

# print("")
# print("二维数组迭代：")
# arr2 = np.array([[1, 2, 3],[4, 5, 6],[7, 8, 9]])
# print(f"数组：{arr2}")
# print("一次迭代：")
# for i in arr2:
#     print(i)

# arr3 = np.array([[1, 2, 3],[4, 5, 6],[7, 8, 9]])
# print(f"数组：{arr3}")
# print("列迭代和逐个元素迭代：")
# for i in arr3.flat:
#     print(i)

# print("连续连续两次迭代：")

##一维数组的索引

# arr = np.arange(0,10)
# print("不含步长：")
# print(f"数组元素：{arr}")
# print(f"单个元素的索引，索引第二个元素：{arr[1]}：")
# print(f"从第二到倒数第一个元素，不包括最后一个元素：{arr[1: -1]}") #[]左闭右开
# print(f"从索引1到索引9：{arr[1: 8]}")
# print(f"从索引2到终止：{arr[2: ]}")
# print(f"从开始到倒数第二个数：{arr[ : -1]}")
# print("")
# print("含步长：")
# print(f"取索引2开始到索引10截止，步长为2：{arr[2: 10: 2]}")
#
# s = slice(2, 10, 2)
# print(f"使用slice函数切片：{arr[s]}")


# ## 二维数组的索引
# arr = np.arange(9).reshape(3,3)
# print("数组为：")
# print(arr)
# print(f"打印数组的1行且1列的元素：{arr[1][1]}")
# print(f'打印数组2，3行且2列的元素：{arr[1:3,1]}') # : 两侧是左闭右开
# print(f'打印第2列的所有元素：{arr[ : ,2]}')
# print(f"打印1-2行和1-2列的元素：\n", arr[0:2,0:2])


# # 10.数组的合并
##水平方向的合并
# arr1 = np.array([[1,1,1],[3,3,3]])
# arr2 = np.array([[2,2,2],[4,4,4]])
# arr3 = np.hstack((arr1,arr2))
# print(f"水平方向的合并：{arr3}")
# print(f"采用concatenate方法在水平方向合并数组：{np.concatenate((arr1, arr2), axis = 1)}")
# print(f"采用column_stack方法在水平方向合并数组：{np.column_stack((arr1, arr2))}")

# # # ##竖直方向合并
# arr3 = np.array([[1,1,1],[3,3,3]])
# arr4 = np.array([[2,2,2],[4,4,4]])
# arr5 = np.vstack((arr3,arr4))
# print(f"使用vstack，竖直方向的合并：{arr5}")
#
# arr6 = np.dstack((arr3,arr4))
# print(f"使用dstack，数组的深向合并：\n",arr6)

# ## 拆分
# arr = np.arange(12).reshape(3,4)
# print(f"采用hsplit函数实现水平拆分（按列拆分）：\n",np.hsplit(arr,2)) #拆分成每行两列
# print(f"采用vsplit函数实现竖直拆分（按行拆分）：\n",np.vsplit(arr, 1))#拆分成每列一行
# print(f"采用axis=0的split实现竖直拆分（按行拆分）：\n",np.split(arr,1,axis = 0))


# # # 11.数组的统计操作
# arr = np.arange(12).reshape(3,4)
# np.random.shuffle(arr)
# print(f"对所有元素求和：{arr.sum()}")
# print(f"对指定维数求和，返回一个数组：{arr.sum(axis= 1)}")
# print(f"最大值：{arr.max()}, 最小值：{arr.min()}")
# print(f"数组中的元素沿axis=1方向的最大值：{arr.max(axis=1)}")
# print(f"数组中anxis=0轴方向的最大值和最小值的差：{arr.ptp(axis=0)}")
# print(f"最大值的位置：{arr.argmax()}, 最小值的位置：{arr.argmin()}")
# print(f"平均值：{arr.mean()}")
# print(f"所有元素求积：{arr.prod()}")
# print(f"标准差：{arr.std()}, 方差：{arr.var()}")
# print("-----------")
# a = np.array([[1,2,3],[4,5,6]])
# print(f"指定权重数组，调用averge()函数的，沿axis=1计算数组中元素的加权平均值：{np.average(a,axis = 1,weights = a)}")
# print(f"调用std()函数，计算数组标准差：{np.std(a)}")

# # 12.修改数组形状shape reshape
# arr1 = np.arange(10)
# arr1.shape = 2,5
# print(f"shap 直接在原数组上修改：{arr1}")
#
# arr2 = np.arange(9)
# arr3 = arr2.reshape(3,3)
# print(f"原数组arr2：{arr2}")
# print(f"修改后的数组arr3：\n",arr3)
#
# arr4 = arr2.reshape(-1, 3)
# print(f"使用-1，系统自动根据其他参数匹配维度：\n",arr4)
#
# print("------")
# arr5 = np.arange(6)
# arr6 = arr5.reshape(-1,3)
# print(f"原数组arr4：{arr5}")
# print(f"当参数为-1时，其他维度自动计算大小：\n",arr6)


# # # 13.改变自身形状 resize
# #元素缺失以0补满，元素过多截取需要元素
# arr1 = np.arange(10)
# arr1.resize(2,5)
# print(arr1)
#
# arr1.resize(4,4)
# print(f"元素过多以0补全：{arr1}")

# # 14.数组的转置 .T
# arr1 = np.arange(12)
# arr1.resize(3,4)
# print(arr1)
# print('------------------')
# print('arr1.T 转置后：')
# arr2 = arr1.T
# print(arr2)
#
# print('------------------')
# print('arr1.transport() 转置后：')
# arr3 = arr1.transpose()
# print(arr3)


# # # 15.数组降维 .flat
# # .flat 先把数组都变成一维，支持修改对应数值
# arr1 = np.arange(10).reshape(2,5)
#
# print("原数组：\n", arr1)
# print(f"打印arr1.flat[-1]: { arr1.flat[-1]}")
#
# arr1.flat[-1] = 100
# print(f"采用arr1.flat[-1]=100修改后打印arr1：\n", arr1)
#
# arr2 = arr1.flatten()
# print(f"采用flatten方法实现数组一维化：{arr2}")

## 16. 数组的四则运算&点乘&比较操作

# arr1 = np.array([[1,2,3],[4,5,6]])
# arr2 = np.array([[1,2,3],[4,5,6]])
# print('arr1:\n',arr1)
# print("arr2: \n",arr2)
# #所有元素+2，加减乘除都一样
# print(f"arr1所有元素+2：\n",arr1+2)
# #所有元素+2，加减乘除都一样
# print("两个数组相减：\n",arr1 - arr2)
# print("arr1**arr2 (arr1对应位置上arr2的次幂)：\n", arr1**arr2)
# print("arr1 % arr2(取余运算)：\n",arr1 % arr2)
# print("arr1 // arr2(取整运算)：\n", arr1//arr2)

# # .dot函数实现矩阵乘法
# arr1 = np.array([[1,2,3],[4,5,6]])
# arr2 = np.array([[1,2,3],[4,5,6]])
# print('arr1:\n',arr1)
# print("arr2: \n",arr2)
# print(" arr1.dot(arr2.T) (.dot()函数实现矩阵乘法):\n", arr1.dot(arr2.T))


# # 数组比较
# arr1 = np.array([[1,2,3],[4,5,6]])
# arr2 = np.array([[4,5,6],[1,2,3]])
# print('arr1:\n',arr1)
# print("arr2: \n",arr2)
# print("arr1>3(数组与一个数进行比较)：\n", arr1>3)
# print("arr1>arr2(数组与数组比较)：\n", arr1 > arr2)

##  17 数组的读写
# ## 读

# #数据分隔字符为空格
# s = np.loadtxt('test.txt',encoding = 'utf-8')
# print(f"读取的数据类型为：{s.dtype}")
# print(f"读取的数据内容为：{s}")


# #数据分隔字符为 ,
# s = np.loadtxt('test.txt',delimiter = ',')
# print(f"读取的数据类型为：{s.dtype}")
# print(f"读取的数据内容为：{s}")

# #  字符串数组
# s = np.loadtxt('test.txt',str)
# print(f"读取的数据类型为：{s.dtype}")
# print(f"读取的数据内容为：{s}")

# #  指定格式读取
# s = np.loadtxt('test.txt',skiprows = 1,dtype = {'names':('name','age','number'),'formats':('S10','i4','f4')})
# print(f"读取的数据类型为：{s.dtype}")
# print(f"读取的数据内容为：{s}")

# #### 数组的写入
# # 默认参数写入
# arr = np.array([[1,2,3],[4,5,6]])
# np.savetxt("test.txt",arr)

# # 使用fmt
# arr = np.array([[1,2,3],[4,5,6]])
# np.savetxt("test.txt",arr,fmt = "%d")

# 使用fmt delimiter
arr = np.array([[1,2,3],[4,5,6]])
np.savetxt("test.txt",arr,fmt = "%d",delimiter = ',')

